function animate(dom, attr_list, callback) {
      for (var attr in attr_list) {
            // 区分特殊值; 
            if (attr === "opacity") {
                  attr_list[attr] = {
                        start: parseInt(getComputedStyle(dom)[attr] * 100),
                        target: attr_list[attr] * 100
                  }
            } else {
                  attr_list[attr] = {
                        start: parseInt(getComputedStyle(dom)[attr]),
                        target: attr_list[attr]
                  }
            }
      }

      console.log(attr_list);

      clearInterval(dom.t);
      dom.t = setInterval(function () {
            // 每次定时器执行，都去改变所有的属性值; 
            for (var attr in attr_list) {
                  // 取出结构之中的起始点和目标点; 
                  var start = attr_list[attr].start;
                  var target = attr_list[attr].target;

                  var speed = (target - start) / 10;

                  speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                  if (target === start) {
                        // clearInterval( dom.t );
                        // 我们何时关闭定时器 ? 
                        // 所有的属性都到达了目标点; 
                        // - 只要有一个属性到达目标点，那么我们就删除一个属性; 
                        delete attr_list[attr];
                        // 判定attr_list之中是否还存在剩余的属性; 
                        // 如果没有剩余的属性了那么我们就可以关闭定时器; 

                        var count = 0;
                        for (var a in attr_list) {
                              count++;
                        }

                        if (count === 0) {
                              clearInterval(dom.t);
                              // 在终止动画时调用动画回调函数; 
                              typeof callback === "function" ? callback() : "";
                        }
                  } else {
                        // 因为当前属性值记录在对象之中所以我们必须在当前的对象属性上加上速度; 
                        attr_list[attr].start += speed;


                        if (attr === "opacity") {
                              dom.style[attr] = attr_list[attr].start / 100;
                        } else {
                              dom.style[attr] = attr_list[attr].start + "px";
                        }
                  }
            }
      }, 30);
}
